# 返回函数
# 高阶函数除了可以接受函数作为参数外，还可以把函数作为结果值返回
def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax

# 闭包
# 返回的函数在其定义内部引用了局部变量args，所以，当一个函数返回了一个函数后，其内部的局部变量还被新函数引用
# 返回函数不要引用任何循环变量，或者后续会发生变化的变量

# 练习
# 利用闭包返回一个计数器函数，每次调用它返回递增整数
def createCounter():
    n = 0
    def counter():
        nonlocal n
        n = n + 1
        return n
    return counter

counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
    print('测试通过!')
else:
    print('测试失败!')